#include"plugboard.h"

PlugBoard::PlugBoard():QWidget()
{
    plugs_valid = (int*) malloc(20*sizeof(int));  //plugs_valid[i] == 1 <=> la ie permutation est valide, plugs_valid[i] == 0 <=> la ie permutation n'est pas valide

    QString s;
    for(int i = 0; i < 20; ++i)
    {
        plugs<<new QComboBox();
        for(char c = 'a'; c <= 'z'; ++c)
        {
            s = c;
            plugs[i]->addItem(s);
        }
        if(i%2)
        {
            labels<<new QLabel("->");
        }
    }

    QGridLayout *layout_plugboard = new QGridLayout;

    for(int i = 0; i < 10;++i)
    {
        labels[i]->setAlignment(Qt::AlignCenter);
    }




    /*
   Position plug n°1
  */
    layout_plugboard->addWidget(plugs[0], 1,0);
    layout_plugboard->addWidget(labels[0],1,1);
    layout_plugboard->addWidget(plugs[1], 1,2);

    /*
   Position plug n°2
  */
    layout_plugboard->addWidget(plugs[2], 0,3);
    layout_plugboard->addWidget(labels[1],0,4);
    layout_plugboard->addWidget(plugs[3], 0,5);

    /*
   Position plug n°3
  */
    layout_plugboard->addWidget(plugs[4], 2,3);
    layout_plugboard->addWidget(labels[2],2,4);
    layout_plugboard->addWidget(plugs[5], 2,5);
    /*
   Position plug n°4
  */
    layout_plugboard->addWidget(plugs[6], 1,6);
    layout_plugboard->addWidget(labels[3],1,7);
    layout_plugboard->addWidget(plugs[7], 1,8);

    /*
   Position plug n°5
  */
    layout_plugboard->addWidget(plugs[8], 0,9);
    layout_plugboard->addWidget(labels[4],0,10);
    layout_plugboard->addWidget(plugs[9], 0,11);


    /*
   Position plug n°6
  */
    layout_plugboard->addWidget(plugs[10], 2,9);
    layout_plugboard->addWidget(labels[5],2,10);
    layout_plugboard->addWidget(plugs[11], 2,11);

    /*
   Position plug n°7
  */
    layout_plugboard->addWidget(plugs[12], 1,12);
    layout_plugboard->addWidget(labels[6],1,13);
    layout_plugboard->addWidget(plugs[13], 1,14);

    /*
   Position plug n°8
  */
    layout_plugboard->addWidget(plugs[14], 0,15);
    layout_plugboard->addWidget(labels[7],0,16);
    layout_plugboard->addWidget(plugs[15], 0,17);

    /*
   Position plug n°9
  */
    layout_plugboard->addWidget(plugs[16], 2,15);
    layout_plugboard->addWidget(labels[8],2,16);
    layout_plugboard->addWidget(plugs[17], 2,17);

    /*
   Position plug n°10
  */
    layout_plugboard->addWidget(plugs[18], 1,18);
    layout_plugboard->addWidget(labels[9],1,19);
    layout_plugboard->addWidget(plugs[19], 1,20);

    this->setLayout(layout_plugboard);

}



int PlugBoard::nb_plugs_ok()
{
    int cpt = 0;
    int j = 0;
    bool ok = true;
    for(int p = 0; p < 20; ++p)
    {
        plugs_valid[p]=0; //a priori rien n'est valide
    }
    for(int i = 0; i < 20; ++i)
    {
        if(i%2) //i est impair, il doit etre différent du son prédecesseur
        {
            ok =( (plugs[i]->currentText()) != (plugs[i-1]->currentText()) );
        }
        else //iest pair, il doit etre différent de son suivant
        {
            ok =( (plugs[i]->currentText()) != (plugs[i+1]->currentText()) );
        }
        j = 0;
        while((j < i) && ok)
        {
            if(plugs_valid[j])
            {
                if( ((plugs[j]->currentText()) == (plugs[i]->currentText())))
                {
                    ok = false; //la partie droite du plugs était déjà présente
                }
            }
            ++j;
        }
        if(ok)
        {
            ++cpt; //Partie gauche unique, partie droite unique et uniques entre elles
            plugs_valid[i] = 1;
        }
        else //une des parties n'est pas valide, il faut invalider toute la permutation
        {
            if((i%2) !=0)
            {
                plugs_valid[i-1] = 0; //La partie gauche devient non valide
            }
            else
            {
                ++i; //On ne teste pas le prochain plug qui est forcément non valide
            }
        }
    }
    return cpt/2; //on a incrémenté cpt pour les parties gauches et droites
}


void PlugBoard::phase2_plugboard()
{
    for(int i = 0; i < 20; ++i)
    {
        if(!plugs_valid[i]) //i ne fait pas parti d'une permutation valide
        {
            plugs[i]->hide();
            labels[i/2]->hide();
        }
        plugs[i]->setDisabled(true);
    }
}

/*
void PlugBoard::phase2_plugboard()
{
    int j = 0;
    bool ok = true;
    for(int p = 0; p < 20; ++p)
    {
        plugs_valid[p]=0; //a priori rien n'est valide
    }
    for(int i = 0; i < 20; ++i)
    {
        plugs[i]->setDisabled(true);
    }
    for(int i = 0; i < 20; i +=2 )
    {
        if( (plugs[i]->currentText()) != (plugs[i+1]->currentText()) )
        {
            j = 0;
            ok = true;
            while((j < i) && ok)
            {
                if( ((plugs[j]->currentText()) == (plugs[i]->currentText())) || ((plugs[j]->currentText()) == (plugs[i+1]->currentText())))
                {
                    ok = false;
                }
                ++j;
            }
            if(!ok) //plugs non valable, on le supprime
            {
                plugs[i]->hide();
                plugs[i+1]->hide();
                labels[i/2]->hide();
            }
            else
            {
                plugs_valid[i] = 1;
                plugs_valid[i+1] = 1;
            }
        }
        else
        {

            plugs[i]->hide();
            plugs[i+1]->hide();
            labels[i/2]->hide();
        }
    }
}
*/
/*
  Return true si la ie ComboBox fait partie d'une permutation valide
  */
bool PlugBoard::get_validite(int i)
{
    if((i < 0) || (i > 19))
        exit(1);
    else
    {
        return plugs_valid[i];
    }

}

QComboBox* PlugBoard::getPlug(int i)
{
    if((i < 0) || (i > 19))
        exit(1);
    else
        return plugs[i];
}


void PlugBoard::raz_plugs()
{
    for(int i = 0; i < 20;i+=2)
    {
        plugs[i]->show();
        plugs[i]->setDisabled(false);
        labels[i/2]->show();
        plugs[i+1]->show();
        plugs[i+1]->setDisabled(false);
    }
}

